package aspectos;

import java.util.Date;

import dao.AuditoriaLogDao;
import excepciones.DaoException;

import modelo.AuditoriaLog;

public aspect AspectosAuditoria {
	
	private pointcut miPointcutCreate(): execution(public void dao.AbstractDao.create() );
	
	private pointcut miPointcutDelete(): execution(public void dao.AbstractDao.delete() );
	
	private pointcut miPointcutUpdate(): execution(public void dao.AbstractDao.update() );
	   
	   after(dao.AbstractDao modelo): miPointcutCreate() && target(modelo){
		   if(modelo.getModel().isAuditable()){
			   AuditoriaLog auditoria = new AuditoriaLog();
			   auditoria.setOperacion("Crear");		   
			   auditoria.setFechaHora(new Date());		   
			   auditoria.setTipoEntidad(modelo.getModel().getClass().getCanonicalName());
			   auditoria.setIdEntidad(modelo.getModel().getId());
			   
			   AuditoriaLogDao auditoriaDao = new AuditoriaLogDao(auditoria);
			   System.out.println("Inserto Auditoria!");
			   try {
				   auditoriaDao.create();
			   } catch (DaoException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			   }
		   }		   
	   }
	   
	   after(dao.AbstractDao modelo): miPointcutDelete() && target(modelo){
		   if(modelo.getModel().isAuditable()){
			   AuditoriaLog auditoria = new AuditoriaLog();
			   auditoria.setOperacion("Borrar");		   
			   auditoria.setFechaHora(new Date());		   
			   auditoria.setTipoEntidad(modelo.getModel().getClass().getCanonicalName());
			   auditoria.setIdEntidad(modelo.getModel().getId());
			   
			   AuditoriaLogDao auditoriaDao = new AuditoriaLogDao(auditoria);
			   System.out.println("Borrar Auditoria!");
			   try {
				   auditoriaDao.create();
			   } catch (DaoException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			   }
		   }
				   
	   }
	   
	   after(dao.AbstractDao modelo): miPointcutUpdate() && target(modelo){
		   if(modelo.getModel().isAuditable()){
			   AuditoriaLog auditoria = new AuditoriaLog();
			   auditoria.setOperacion("Actualizar");		   
			   auditoria.setFechaHora(new Date());		   
			   auditoria.setTipoEntidad(modelo.getModel().getClass().getCanonicalName());
			   auditoria.setIdEntidad(modelo.getModel().getId());
			   
			   AuditoriaLogDao auditoriaDao = new AuditoriaLogDao(auditoria);
			   System.out.println("Actualizar Auditoria!");
			   try {
				   auditoriaDao.create();
			   } catch (DaoException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			   }
		   }
				   
	   }
}
